/**
 * 新闻数据管理钩子集合
 * 
 * 本模块提供了新闻数据的获取、修改和删除等功能钩子，基于React Query实现。
 * 主要职责：
 * 1. 获取新闻列表和详情数据
 * 2. 提供新闻添加、更新和删除功能
 * 3. 获取新闻分类数据
 * 4. 处理数据缓存和自动刷新
 * 
 * 这些钩子使得新闻数据操作与UI组件解耦，使组件代码更加简洁，
 * 并提供一致的数据获取和操作方式。
 * 
 * @module hooks/useNews
 */
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { getNewsList, getNewsById, addNews, updateNews, deleteNews, getCategories } from '../api';
import { News, Category } from '../types';

// API响应数据处理函数
function processApiResponse<T>(response: unknown): T {
  if (!response) return {} as T;
  
  // 处理可能的不同响应格式
  if (typeof response === 'object' && response !== null) {
    // 如果响应对象有data属性
    if ('data' in response && response.data !== undefined) {
      const data = (response as { data: unknown }).data;
      // 可能有嵌套的data结构
      if (typeof data === 'object' && data !== null && 'data' in data) {
        return (data as { data: T }).data;
      }
      return data as T;
    }
  }
  
  // 如果无法处理，返回原始响应
  return response as T;
}

/**
 * 获取新闻列表
 * @param params 查询参数
 */
export const useNewsList = (params?: Record<string, string | number | boolean>) => {
  return useQuery({
    queryKey: ['newsList', params],
    queryFn: async () => {
      const response = await getNewsList(params);
      return processApiResponse<News[]>(response);
    }
  });
};

/**
 * 获取新闻详情
 * @param id 新闻ID
 */
export const useNewsDetail = (id: number) => {
  return useQuery({
    queryKey: ['newsDetail', id],
    queryFn: async () => {
      const response = await getNewsById(id);
      return processApiResponse<News>(response);
    },
    enabled: !!id, // 只有当id存在时才执行查询
  });
};

/**
 * 获取新闻分类
 */
export const useCategories = () => {
  return useQuery({
    queryKey: ['categories'],
    queryFn: async () => {
      const response = await getCategories();
      return processApiResponse<Category[]>(response);
    }
  });
};

/**
 * 添加新闻
 */
export const useAddNews = () => {
  const queryClient = useQueryClient();
  
  return useMutation({
    mutationFn: (newsData: Omit<News, 'id'>) => addNews(newsData),
    onSuccess: () => {
      // 成功后使缓存的新闻列表失效，以便重新获取
      queryClient.invalidateQueries({ queryKey: ['newsList'] });
    }
  });
};

/**
 * 更新新闻
 */
export const useUpdateNews = () => {
  const queryClient = useQueryClient();
  
  return useMutation({
    mutationFn: ({ id, data }: { id: number; data: Partial<News> }) => updateNews(id, data),
    onSuccess: (_, variables) => {
      // 成功后使缓存的新闻列表和详情失效
      queryClient.invalidateQueries({ queryKey: ['newsList'] });
      queryClient.invalidateQueries({ queryKey: ['newsDetail', variables.id] });
    }
  });
};

/**
 * 删除新闻
 */
export const useDeleteNews = () => {
  const queryClient = useQueryClient();
  
  return useMutation({
    mutationFn: (id: number) => deleteNews(id),
    onSuccess: () => {
      // 成功后使缓存的新闻列表失效
      queryClient.invalidateQueries({ queryKey: ['newsList'] });
    }
  });
};